﻿using GamFi.Admin.API.Application.Contracts.Token.AddToken;
using GamFi.Admin.API.Application.Contracts.Token.GetTokens;
using GamFi.Admin.API.Application.Contracts.Token.UpdateToken;
using GamFi.Admin.API.Application.Features.Queries.Token.AddToken;
using GamFi.Admin.API.Application.Features.Queries.Token.DeleteToken;
using GamFi.Admin.API.Application.Features.Queries.Token.GetTokens;
using GamFi.Admin.API.Application.Features.Queries.Token.UpdateToken;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace GamFi.Admin.API.WEB.Controllers;

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class TokenController(IMediator mediator) : ControllerBase
{
    /// <summary>
    /// Возвращает все чейны
    /// </summary>
    /// <param name="request"></param>
    /// <param name="cancellationToken"></param>
    /// <returns>Все чейны</returns>
    [HttpGet("GetTokens")]
    public async Task<GetTokensResponse> GetTokens([FromQuery] GetTokensRequest request,
        CancellationToken cancellationToken)
        => await mediator.Send(new GetTokensQuery(request), cancellationToken);

    /// <summary>
    /// Добавление нового токена
    /// </summary>
    /// <param name="request"></param>
    /// <param name="cancellationToken"></param>
    [Authorize]
    [HttpPost("AddToken")]
    public async Task AddToken([FromBody] AddTokenRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new AddTokenCommand(request), cancellationToken);
    
    /// <summary>
    /// Обновляет токен.
    /// </summary>
    /// <param name="request">Запрос на обновление сообщения.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат обновления.</returns>
    [HttpPut("UpdateToken")]
    public async Task UpdateToken(UpdateTokenRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new UpdateTokenCommand(request), cancellationToken);
    
    /// <summary>
    /// Удаляет токен по его идентификатору.
    /// </summary>
    /// <param name="id">Идентификатор токена, которое требуется удалить.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат удаления.</returns>
    [HttpDelete("DeleteMessage/{id:guid}")]
    public async Task DeleteToken(Guid id, CancellationToken cancellationToken)
        => await mediator.Send(new DeleteTokenCommand(id), cancellationToken);
}